#include "head.h"

#define UDP_SERVER_IP_STR    "192.168.31.13"
#define UDP_SERVER_PORT   50000
#define EXIT_WORD "_EXIT"

char * GetUsrInput( char strWord[] )
{
    printf( "Pls input word: " );

    fgets( strWord, 100, stdin );  
    strWord[strlen(strWord)-1] = '\0';       

    return strWord;
}

int SetUdpServer( const char strUdpServerIp[], const int UpdServerPort,
                    int *pUdpServerSockFp, struct sockaddr_in *pUdpServerAddr )
{
    *pUdpServerSockFp = socket( AF_INET, SOCK_DGRAM, 0 );
    if ( -1 == *pUdpServerSockFp )
    {
        perror( "fail socket" );
        return -1;
    }

    pUdpServerAddr->sin_family = AF_INET;
    pUdpServerAddr->sin_port   = htons( UpdServerPort );
    pUdpServerAddr->sin_addr.s_addr = inet_addr( strUdpServerIp ); 

    return 0;

}

int SendtoUpdServer( const int UdpServerSockFp, const struct sockaddr_in UdpServerAddr,
                        const char strSendBuff[], const int strLen )
{
    ssize_t sizeRet = sendto( UdpServerSockFp, strSendBuff, strLen, 0, (struct sockaddr*)&UdpServerAddr, sizeof(UdpServerAddr) );
    if ( -1 == sizeRet )
    {
        perror( "fail sendto" );
        return -1;
    }
    return 0;
}

int main(int argc, char const *argv[])
{
    char strSendBuff[1024] = {0};
    int UdpServerSockFp;
    struct sockaddr_in UdpServerAddr;

    SetUdpServer( UDP_SERVER_IP_STR, UDP_SERVER_PORT, 
                    &UdpServerSockFp, &UdpServerAddr);

    while ( strcmp( GetUsrInput(strSendBuff), EXIT_WORD ) != 0 )
    {
        SendtoUpdServer( UdpServerSockFp, UdpServerAddr, strSendBuff, strlen(strSendBuff) );
    }


    close( UdpServerSockFp );

    return 0;
}

/*
程序功能
    接收用户键盘输入一个字符串, 并发送给 UDP服务器 的指定 端口.
    如果用户输入事先约定的 EXIT_WORD, 则程序退出.

涉及函数
    socket()
    htons()
    inet_addr()
    sendto()

程序流程
    建立一个 UDP 套接字
    初始化 UDP服务器地址结构体
    发送 UDP数据报 到 UDP服务器的 指定端口
    关闭 UDP套接字

知识要点
    UDP协议
    UDP数据报文的格式
    谢希仁<计算机网络>P215
    <Linux程序设计> P543

测试流程
    在局域网中的另外一台计算机作为 UDP服务器, 运行 网络调试助手NetAssist
    根据 UDP服务器 的 IP地址, 修改程序中的 UDP_SERVER_IP_STR
    设置 UDP服务器 的 UDP端口 为 50000 (与程序中的 UDP_SERVER_PORT_INT 匹配 )
    运行程序, 可以看到 UDP服务器 收到本程序所发送的 UDP数据报文
*/